/*
 * Mail.java
 * 
 * LEDS - Laboratório de Engenharia e Desenvolvimento de Software
 * IFES - Instituto Federal do Espírito Santo - Campus Serra.
 */
package util.utilitarioMail;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Properties;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.MultiPartEmail;
import org.apache.commons.mail.SimpleEmail;
import srac.controleeventos.cdp.Certificado;
import srac.controleeventos.cgt.AplEnviarCertificado;

public class Mail {

    static private Mail instance = null;
    static public final String END_DESTINATARIO = "destinatario";
    static public final String NOME_DESTINATARIO = "nome_destinatario";
    static public final String ASSUNTO = "assunto";
    static public final String ANEXO = "anexo";
    static public final String DESCRICAO_ANEXO = "destinatario";
    static public final String ASSINATURA = "assinatura";
    static public final String HTML_MSG = "html_msg";
    static public final String TEXT_MSG = "text_msg";
    static public final String CONTEUDO = "conteudo";
    
    private final String USUARIO = "usuario";
    private final String SENHA = "senha";
    private final String SMTP_PORT = "smtp_port";
    private final String FROM = "from";
    private final String HOST_NAME = "host_name";
    private final String EMAIL = "email";
    private final String NOME = "nome";
    
    private Properties emailProperties = null;
    
    static public Mail getInstance() throws EmailException, MalformedURLException {
        if (instance == null) {
            instance = new Mail();
        }
        return instance;
    }

    /**
     * envia email simples(somente texto)
     *
     * @throws EmailException
     */
    public void enviarEmailSimples(HashMap map) throws EmailException, IOException {
        this.retrieveEMailProperties();// recupera as propriedades
        
        SimpleEmail email = new SimpleEmail();
        
        
        email.setHostName(this.emailProperties.getProperty(this.HOST_NAME)); // o servidor SMTP para envio do e-mail
        email.addTo(map.get(Mail.END_DESTINATARIO).toString()); //destinatário  
        email.setFrom(this.emailProperties.getProperty(this.EMAIL), this.emailProperties.getProperty(this.NOME)); // remetente
        email.setSubject(map.get(Mail.ASSUNTO).toString()); // assunto do e-mail  
        email.setMsg(String.format("Sr(a) %s\n $s\n", map.get(Mail.NOME_DESTINATARIO), map.get(Mail.CONTEUDO), map.get(Mail.ASSINATURA))); //conteudo do e-mail  
        email.setAuthentication(this.emailProperties.getProperty(this.USUARIO), this.emailProperties.getProperty(this.SENHA));
        email.setSmtpPort(Integer.parseInt(this.emailProperties.getProperty(this.SMTP_PORT, "465")));
        email.setSSL(true);
        email.setTLS(true);
        email.send();
    }

    /**
     * Envia um e-mail genérico com anexo File. HashMap com as seguintes informações em String
     * - ASSUNTO: é o assunto do email
     * - DESCRICAO_ANEXO: descrição do anexo que está sendo enviado
     * - END_DESTINATARIO: endereço de e-mail do destinatário
     * - NOME_DESTINATARIO: nome do destinatário
     * - CONTEUDO: conteúdo do email, corpo da mensagem
     * - ASSINATURA: assinatura do email.
     * @param map
     * @param f
     * @throws EmailException 
     */
    public void enviarEmailComAnexo(HashMap map, File f) throws EmailException, IOException {
        this.retrieveEMailProperties();
        
        System.out.println(this.emailProperties.getProperty(this.NOME));
        
        // cria o anexo 1.  
        EmailAttachment anexo1 = new EmailAttachment();
        anexo1.setPath(f.getPath()); //caminho do arquivo (RAIZ_PROJETO/teste/teste.txt)  
        anexo1.setName(f.getName()); // nome do arquivo, não esquecer a extensão
        anexo1.setDescription(map.get(Mail.DESCRICAO_ANEXO).toString()); // descrição do anexo
        anexo1.setDisposition(EmailAttachment.ATTACHMENT);
        
        // configura o email  
        MultiPartEmail email = new MultiPartEmail();
        email.setHostName(this.emailProperties.getProperty(this.HOST_NAME)); // o servidor SMTP para envio do e-mail
        email.addTo(map.get(Mail.END_DESTINATARIO).toString()); //destinatário  
        email.setFrom(this.emailProperties.getProperty(this.FROM), this.emailProperties.getProperty(this.NOME)); // remetente
        email.setSubject(map.get(Mail.ASSUNTO).toString()); // assunto do e-mail  
        email.setMsg(String.format("Sr(a) %s\n %s\n", map.get(Mail.NOME_DESTINATARIO), map.get(Mail.CONTEUDO), map.get(Mail.ASSINATURA))); //conteudo do e-mail  
        email.setAuthentication(this.emailProperties.getProperty(this.USUARIO), this.emailProperties.getProperty(this.SENHA));
        email.setSmtpPort(Integer.parseInt(this.emailProperties.getProperty(this.SMTP_PORT, "465")));
        email.setSSL(true);
        email.setTLS(true);
        //email.addCc("@gmail.com"); //FIXME adicionado para teste, retirar essa linha

        // adiciona arquivo(s) anexo(s)  
        email.attach(anexo1);

        // envia o email  
        email.send();
        //TODO deletar o file depois da chamada
    }
    /**
     * envia email com arquivo anexo
     *
     * @throws EmailException
     */
    public void enviarEmailComAnexo(Certificado c, File f) throws EmailException, IOException {
        
        this.retrieveEMailProperties();// recupera as propriedades
        // cria o anexo 1.  
        EmailAttachment anexo1 = new EmailAttachment();
        anexo1.setPath("certificado/Certificado.pdf"); //caminho do arquivo (RAIZ_PROJETO/teste/teste.txt)  
        anexo1.setDisposition(EmailAttachment.ATTACHMENT);
        anexo1.setDescription("Certificado do Evento - "+c.getEvento().getNome());
        anexo1.setName("Certificado.pdf");

        // configura o email  
        MultiPartEmail email = new MultiPartEmail();
        
        email.setHostName("smtp.gmail.com"); // o servidor SMTP para envio do e-mail
        email.addTo(c.getParticipante().getEmail(), c.getParticipante().getNome()); //destinatário  
        email.setFrom("ledsifes@gmail.com", "LEDS IFES"); // remetente  
        email.setSubject("Certificado do Evento - "+c.getEvento().getNome()); // assunto do e-mail  
        email.setMsg("Segue em anexo o certificado do evento "+c.getEvento().getNome()); //conteudo do e-mail  
        email.setAuthentication(this.emailProperties.getProperty(this.USUARIO), this.emailProperties.getProperty(this.SENHA));
        email.setSmtpPort(Integer.parseInt(this.emailProperties.getProperty(this.SMTP_PORT, "465")));
        email.setSSL(true);
        email.setTLS(true);
        //email.addCc("@gmail.com", "leds"); //FIXME adicionado para teste, retirar essa linha
        // adiciona arquivo(s) anexo(s)  
        email.attach(anexo1);

        // envia o email  
        email.send();
        
        //TODO deletar o file
    }

    /**
     * Envia email no formato HTML
     *
     * @throws EmailException
     * @throws MalformedURLException
     */
    public void enviarEmailFormatoHtml(HashMap map) throws EmailException, MalformedURLException, IOException {
        this.retrieveEMailProperties();// recupera as propriedades
        HtmlEmail email = new HtmlEmail();
        // adiciona uma imagem ao corpo da mensagem e retorna seu id  
        URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
        String cid = email.embed(url, "Apache logo");
        
        // configura a mensagem para o formato HTML  
        email.setHtmlMsg((String)map.get(Mail.HTML_MSG));

        // configure uma mensagem alternativa caso o servidor não suporte HTML  
        email.setTextMsg((String)map.get(Mail.TEXT_MSG));

        email.setHostName(this.emailProperties.getProperty(this.HOST_NAME)); // o servidor SMTP para envio do e-mail  
        email.addTo((String)map.get(Mail.END_DESTINATARIO)); //destinatário  
        email.setFrom(this.emailProperties.getProperty(this.FROM), this.emailProperties.getProperty(this.NOME)); // remetente  
        email.setSubject((String)map.get(Mail.ASSUNTO)); // assunto do e-mail  
        email.setMsg((String)map.get(Mail.CONTEUDO)); //conteudo do e-mail  
        email.setAuthentication(this.emailProperties.getProperty(this.USUARIO), this.emailProperties.getProperty(this.SENHA));
        email.setSmtpPort(Integer.parseInt(this.emailProperties.getProperty(this.SMTP_PORT, "465")));
        email.setSSL(true);
        email.setTLS(true);
        //email.addCc("@gmail.com", "leds"); //FIXME adicionado para teste, retirar essa linha
        // envia email  
        email.send();
    }
    
    /**
     * Recupera as propriedades do email
     * @return
     * @throws IOException 
     */
    private void retrieveEMailProperties() throws IOException{
        if(this.emailProperties==null){
        this.emailProperties  = new Properties();
        this.emailProperties.load(Mail.class.getClassLoader().getResourceAsStream("/email.properties"));
        //emailProperties.load(new FileInputStream("conf/email.properties"));
        }
    }
    
    
}